Linux标准输入、输出和错误和文件重定向 专题

您所在的位置:网站首页 linux 输入输出重定向 Linux标准输入、输出和错误和文件重定向 专题

Linux标准输入、输出和错误和文件重定向 专题

2024-06-23 10:14| 来源: 网络整理| 查看: 265

当我们在shell中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件。由于文件描述符不容易记忆,shell同时也给出了相应的文件名。

下面就是这些文件描述符及它们通常所对应的文件名:

文件文件描述符系统中实际上有12个文件描述符,但是正如我们在上表中所看到的, 0、1、2是标准输入、输出和错误。可以任意使用文件描述符3到9。

标准输入是文件描述符0。它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。 标准输出是文件描述符1。它是命令的输出,缺省是屏幕,也可以是文件。 标准错误是文件描述符2。这是命令错误的输出,缺省是屏幕,同样也可以是文件。

你可能会问,为什么会有一个专门针对错误的特殊文件?这是由于很多人喜欢把错误单独保存到一个文件中,特别是在处理大的数据文件时,可能会产生很多错误。如果没有特别指定文件说明符,命令将使用缺省的文件说明符(你的屏幕,更确切地说是你的终端)。

文件重定向

在执行命令时,可以指定命令的标准输入、输出和错误,要实现这一点就需要使用文件重定向。下表列出了最常用的重定向组合,并给出了相应的文件描述符。在对标准错误进行重定向时,必须要使用文件描述符,但是对于标准输入和输出来说,这不是必需的。

command sort.out  //与上面的等价,什么也不写的>,默认就是1【标准输出】可以把很多命令的输出追加到同一文件中。

如果希望把标准输出重定向到文件中,可以用>filename。在下面的例子中,ls命令的所有输出都被重定向到ls.out文件中:$ ls >ls.out

如果想创建一个长度为0的空文件,可以用>filename:$ >myfile

重定向标准输入

可以指定命令的标准输入。在awk一章就会遇到这样的情况。下面给出一个这样的例子:$ sort < name.txt在上面的命令中, sort命令的输入是采用重定向的方式给出的,不过也可以直接把相应的文件作为该命令的参数:$ sort name.txt在上面的例子中,还可以更进一步地通过重定向为sort命令指定一个输出文件name.out。这样屏幕上将不会出现任何信息(除了错误信息以外):$ sort name.out在发送邮件时,可以用重定向的方法发送一个文件中的内容。在下面的例子中,用户louise将收到一个邮件,其中含有文件contents.txt中的内容:$ mail louise < contents.txt

重定向操作符command bye... > MAYDAY

$ cat myfile Hello there I am using a vt100 terminal and my user name is dave bye...

 

重定向标准错误

为了重定向标准错误,可以指定文件描述符2。grep命令没有找到该文件,缺省地向终端输出了一个错误信息。现在让我们把错误重定向到文件/dev/null中(实际就上是系统的垃圾箱):$ grep "trident" missiles 2>/dev/null这样所有的错误输出都输送到了/dev/null,不再出现在屏幕上。

 

合并标准输出和标准错误

在合并标准输出和标准错误的时候,切记shell是从左至右分析相应的命令的。下面给出一个例子:$ cleanup >cleanup.out 2>&1在上面的例子中,我们将cleanup 脚本的输出重定向到>cleanup.out文件中,而且其错误也被重定向到相同的文件中。$ grep "standard"* > grep.out 2>&1在上面的例子中,grep命令的标准输出和标准错误都被重定向到grep.out文件中。你在使出前面提到的“此处”文挡时,有可能需要把所有的输出都保存到一个文件中,这样万一出现了错误,就能够被记录下来。通过使用2 > & 1就可以做到这一点

http://blog.sina.com.cn/s/blog_51dc0fba0100lqgb.html

shell中可能经常能看到:>/dev/null  2>&1  //即忽略所以输出信息。详解:标准输出【不写即为标准输出1】的内容输出到/dev/null【recycle bin】,2【标准错误】的内容输出到1【标准输出】的位置即【recycle bin】

eg:sudo kill -9 `ps -elf |grep -v grep|grep $1|awk '{print $4}'` 1>/dev/null 2>/dev/null或eg:sudo kill -9 `ps -elf |grep -v grep|grep $1|awk '{print $4}'` >/dev/null  2>&1

命令的结果可以通过%>的形式来定义输出

/dev/null 代表空设备文件,即recycle bin,比windows的回收站更彻底,即少了清空回收站这一步> 代表重定向到哪里,例如:echo "123" > /home/123.txt1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"2 表示stderr标准错误& 表示等同于的意思,2>&1,表示2的输出重定向等同于1,即和1重定向的文件系统上的位置是一样的

那么本文标题的语句:1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。2>&1 接着,标准错误输出重定向等同于 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

脚本只使用标准输入、标准输出和标准错误

Shell会自动为我们打开和关闭0、1、2这三个文件描述符,我们不需要显式地打开或关闭它们。标准输入是命令的输入,默认指向键盘;标准输出是命令的输出,默认指向屏幕;标准错误是命令错误信息的输出,默认指向屏幕。如果没有显式地进行重定向,命令通过文件描述符0从屏幕读取输入,通过文件描述符1和2将输出和错误信息输出到屏幕。但如果我们想从其他文件(再次强调,I/O设备在Unix/Linux中也是文件)读取输入或产生输出,就需要对0、1、2使用重定向了。其语法如下:

command < filename                         把标准输入重定向到filename文件中command 0< filename                       同上

command > filename                         把标准输出重定向到filename文件中(覆盖)command 1> fielname                       同上

command >> filename                       把标准输出重定向到filename文件中(追加)command 1>> filename                     同上 

command 2> filename                       把标准错误重定向到filename文件中(覆盖)command 2>> filename                     同上

command > filename 2>&1               把标准输出和标准错误一起重定向到filename文件中(覆盖)command >> filename 2>&1             把标准输出和标准错误一起重定向到filename文件中(追加)

command < filename >filename2        把文件filename中的内容作为command的输入,把标准输出重定向到filename2文件中

command 0< filename 1> filename2   同上

重定向的使用有如下规律:1)标准输入0、输出1、错误2需要分别重定向,一个重定向只能改变它们中的一个。2)标准输入0和标准输出1可以省略。(当其出现重定向符号左侧时)3)文件描述符在重定向符号左侧时直接写即可,在右侧时前面加& 【类似于指针前要加*号,来区分这、两种情况】。4)文件描述符与重定向符号之间不能有空格!

http://blog.sina.com.cn/s/blog_4aae007d010192qc.html  


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3